package handler_sys

import (
	_ "go_web/internal/model"
	"go_web/internal/model/model_sys"
	"go_web/internal/req/req_sys"
	"go_web/internal/res/res_sys"
	"go_web/internal/service/service_sys"
	"go_web/pkg/req"
	"go_web/pkg/res"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

type SysRouteAuthHandler struct {
	SysRouteAuthService *service_sys.SysRouteAuthService
}

func NewSysRouteAuthHandler(SysRouteAuthService *service_sys.SysRouteAuthService) *SysRouteAuthHandler {
	return &SysRouteAuthHandler{SysRouteAuthService}
}

// Detail 查询SysRouteAuth详情
// @Summary 查询SysRouteAuth详情
// @Tags SysRouteAuthHandler
// @Accept json
// @Produce json
// @Param id query string true "主键ID"
// @Success 200 {object} res.R[model_sys.SysRouteAuth] "SysRouteAuth"
// @Router /sys_route_auth/detail [get]
func (h *SysRouteAuthHandler) Detail(ctx *gin.Context) {
	id := ctx.Query("id")
	id64, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
		return
	}
	SysRouteAuth, err := h.SysRouteAuthService.Detail(ctx, id64)
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail("查询不到"))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[model_sys.SysRouteAuth]().Ok(*SysRouteAuth))
}

// Page 分页查询SysRouteAuth
// @Summary 分页查询SysRouteAuth
// @Tags SysRouteAuthHandler
// @Accept json
// @Produce json
// @Param queryParams query req_sys.SysRouteAuthPageReq false "分页请求参数"
// @Success 200 {object} res.R[res.PageRes]
// @Router /sys_route_auth/page [get]
func (h *SysRouteAuthHandler) Page(ctx *gin.Context) {
	var pageReq req_sys.SysRouteAuthPageReq
	if err := ctx.ShouldBindQuery(&pageReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	page, err := h.SysRouteAuthService.Page(ctx, pageReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, res.NewR[res.PageRes]().Ok(*page))
}

// Add 创建SysRouteAuth
// @Summary 创建SysRouteAuth
// @Tags SysRouteAuthHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysRouteAuthAddReq true "SysRouteAuth"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys_route_auth/add [post]
func (h *SysRouteAuthHandler) Add(ctx *gin.Context) {
	var reqSys req_sys.SysRouteAuthAddReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	id, err := h.SysRouteAuthService.Add(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(id))
}

// Edit 修改SysRouteAuth
// @Summary 修改SysRouteAuth
// @Tags SysRouteAuthHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysRouteAuthEditReq true "SysRouteAuth"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys_route_auth/edit [post]
func (h *SysRouteAuthHandler) Edit(ctx *gin.Context) {
	var reqSys req_sys.SysRouteAuthEditReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysRouteAuthService.Edit(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// Delete 删除SysRouteAuth
// @Summary 删除SysRouteAuth
// @Tags SysRouteAuthHandler
// @Accept json
// @Produce json
// @Param jsonParams body req.IdsReq true "ID集合"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys_route_auth/delete [post]
func (h *SysRouteAuthHandler) Delete(ctx *gin.Context) {
	var idsReq req.IdsReq
	if err := ctx.ShouldBindJSON(&idsReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysRouteAuthService.Delete(ctx, idsReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// SaveRoleSysRouteAuth 保存角色路由权限
// @Summary 保存角色路由权限
// @Tags SysRouteAuthHandler
// @Accept json
// @Produce json
// @Param jsonParams body []res_sys.SysRouteAllRes true "专门用于 重新赋予资源权限的请求实体"
// @Param role query string true "角色字典值"
// @Success 200 {object} res.R[string] "操作结果"
// @Router /sys_route_auth/save-role [post]
func (h *SysRouteAuthHandler) SaveRoleSysRouteAuth(ctx *gin.Context) {
	var sysRouteAllParamList []*res_sys.SysRouteAllRes
	if err := ctx.ShouldBindJSON(&sysRouteAllParamList); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	role := ctx.Query("role")
	err := h.SysRouteAuthService.SaveRoleSysRouteAuth(ctx, sysRouteAllParamList, role)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[string]().Ok("保存成功"))
}

// SaveUserSysRouteAuth 保存用户路由权限
// @Summary 保存用户路由权限
// @Tags SysRouteAuthHandler
// @Accept json
// @Produce json
// @Param jsonParams body []res_sys.SysRouteAllRes true "专门用于 重新赋予资源权限的请求实体"
// @Param userID query int64 true "用户ID"
// @Success 200 {object} res.R[string] "操作结果"
// @Router /sys_route_auth/save-user [post]
func (h *SysRouteAuthHandler) SaveUserSysRouteAuth(ctx *gin.Context) {
	var sysRouteAllParamList []*res_sys.SysRouteAllRes
	if err := ctx.ShouldBindJSON(&sysRouteAllParamList); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	userIdStr := ctx.Query("userID")
	userId, err := strconv.ParseInt(userIdStr, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	err = h.SysRouteAuthService.SaveUserSysRouteAuth(ctx, sysRouteAllParamList, userId)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[string]().Ok("保存成功"))
}
